/*
 * RLE.cpp
 *
 *  Created on: 28/06/2012
 *      Author: danielspacek
 */

#include "RLE"

//Federico: src: archivo de entrada, dest:archivo de salida
//Federico: el src de rle, y dest, de derle, tienen tamaño blocksize
//así que en rle() lo llamás con srcsize=blocksize
//Federico: rle::dest y derle::src son los comprimidos

integer rle(uchar src[], uchar dest[], integer srcsize) {
	integer i = 0;
	for(integer j = 0; j < srcsize; j++) {
		uchar c;
		dest[i++] = (c = src[j]);
		if(!c) {
			uchar n = 0;
			while((j + n + 1 < srcsize)
							&& (src[j + n + 1] == c)
							&& (n < UCHAR_MAX)) {
				n++;
			}
			j += n;
			dest[i++] = n;
		}
	}
	return i;
}

integer derle(uchar src[], uchar dest[], integer srcsize) {
	integer i = 0;
	for(integer s = 0; s < srcsize; s++) {
		dest[i] = src[s];
		if(!dest[i++]) {
			uchar n = src[++s];
			while(n--) dest[i++] = 0;
		}
	}
	return i;
}

